在我用Java编写的TCP服务器中,有时随机客户端会有5到60秒的延迟。发生这种情况时,服务器有足够的可用内存和cpu。发生这种情况时套接字已经打开。这种情况随机发生在某些客户身上。java进程继续,就好像数据已发送一样,但服务器不会物理地发送/接收数据。我已禁用Nagle,但我不明白Nagle是如何导致这种延迟的。我不是很具体,因为我对此感到困惑。理论上是什么导致了这种情况?另一件事:当其中一个客户端出现严重滞后时,其他客户端运行良好。它们都在服务器的同一个以太网接口(interface)上。我无法解释这样的事情。 最佳答案 Wh
详细信息:我正在运行VS。Azure云服务上的WebApi应用程序。我正在调试的开发环境中运行(不确定这是否重要)。当我使用fiddler执行下面的web方法时,大多数时候响应非常快——大约200毫秒完成交易时间。但是,有时响应会超过1-2秒。我试图理解为什么。为了进行故障排除,我同时使用了fiddler诊断结果以及我放置在响应中的自定义header,该header为我提供了一些时间信息(X诊断)问题:考虑到下面的fiddler响应与我的自定义诊断并列,并且再次考虑到大多数时候我的响应非常快;为什么TCP/IP连接超过1000ms?为什么fiddler的beginrequest和方法的
我有一个使用C#2010的客户端-服务器应用程序。在TCP套接字中,我为应用程序中所有连接的套接字(客户端-服务器)设置了Nodelay=True和SendBufferSize=0。我正在跟踪每个传入-传出数据包,并使用streamwriter将其写入日志文件,它的autoflush属性设置为true。我注意到一件事,有时在发送数据时2个数据包之间存在恒定延迟(15-16毫秒)。连续发送几次后,此延迟再次出现。为什么会延迟?我怎样才能避免它....查看图片...http://s4.postimg.org/uoly38shp/Trace_1.pnghttp://s14.postimg.o
我有一个设备通过TCP每20毫秒发送一次数据。我有一个连接到此设备的应用程序,启动套接字通信。我的应用程序在一个单独的线程上监听并在数据准备好时尽快读取数据,将数据放在一边,然后由其他线程处理它。设备通过以太网电缆直接连接到计算机。我看到一个奇怪的问题,我试图理解为什么几乎每分钟一次,从设备接收数据包需要大约50毫秒。我做了一个阻塞读取,它会尝试读取一秒钟,并且会在数据准备好时尽快完成,通常它需要大约20毫秒,正如我所期望的那样,但就像我之前说的那样,有时它需要50毫秒,即使它是非常罕见(3000分之一)。我注意到的是延迟数据包之后的数据包立即到达,所以这让我觉得网络层有一些延迟。我还
我想知道TCP通信中的延迟是如何计算的。是往返时间(RTT),即向接收方发送消息与发送方接收确认的时间之间的时间。或者将消息从发送者发送到接收者的一种方式。谢谢,卡西克 最佳答案 两者都不是。它是一侧应用程序发送数据与另一侧应用程序接收数据之间的时间。它必须至少是单程时间。但取决于TCP协议(protocol)本身的情况,它可能包括确认以其他方式进行的时间或某些TCP计时器到期所需的时间。 关于tcp-TCP中的延迟是往返时间(RTT)或单程时间,我们在StackOverflow上找到一
我有一个项目,每10-12毫秒传输一串小数据包,我还尝试了不同的程序,一个用C++编写,另一个用python编写,以查看我的实现是否有误,但没有任何改变。因为它在我本地连接时有效,所以我看不出编程和网络代码是如何受到指责的。我尝试更新驱动程序,但没有解决问题。我尝试用完全相同的组件和软件构建一个新桌面。它适用于该PC。老实说,对于这个烦人的问题,我找不到单一的模式或解释,更不用说解决方案了。什么会导致这种行为?它不能是缓冲区,因为它在本地工作?我尝试更改它并使客户端每秒仅发送10次数据。它不应该是数据包丢失,因为我在没有无线的本地网络上使用TCP。两台PC和一根以太网线。网页加载速度快
我正在开发使用MicrosoftRPC(通过TCP)作为通信方法的客户端-服务器软件。我们有时会将文件从客户端传输到服务器。这在本地网络中运行良好。不幸的是,当我们有高延迟时,即使是非常宽的带宽也无法提供像样的传输速度。基于WireShark日志,RPC层发送一堆片段,然后在发送更多片段之前等待来自服务器的ACK,这会导致延迟主导传输时间。我正在寻找一种方法来告诉RPC在暂停之前发送更多数据包。这个问题似乎与TCP窗口太小本质上是一样的,但这里可能有一个特定于RPC的片段窗口在起作用,因为Wireshark不会显示TCP级窗口已满。使用小窗口的iPerf连接测试确实会给出这些警告,并且
我正在尝试在Windows计算机上复制一个实时应用程序,以便能够更轻松地进行调试和更改,但我遇到了延迟确认问题。我已经禁用了nagle并确认它稍微提高了速度。当发送大量小数据包时,窗口不会立即确认并延迟200毫秒。对此进行了更多研究,我遇到了this.更改注册表值的问题在于,它会影响整个系统,而不仅仅是我正在使用的应用程序。无论如何,是否可以使用setsockopt在linux中禁用TCP_QUICKACK等窗口系统上的延迟ACK?我尝试对12进行硬编码,但从WSAGetLastError得到了WSAEINVAL。我在github上看到一些开发人员提到使用SIO_TCP_SET_ACK
我正在编写一个应该从服务器接收文件的客户端应用程序。通信使用基于TCP设计的非常简单的专有协议(protocol):服务器发送一个16KB的数据block,等待来self的客户端的简单响应,然后继续下一个数据block;这样做直到文件被完全传输。服务器在Windows上运行。如果我在Windows上运行我的客户端(通过Cygwin),我可以达到70Mbits/s的吞吐量。但是,如果我在Linux上运行它,我可以获得的最大吞吐量是5Mbits/s(两个测试都使用相同的100Mb以太网链路)。在对我收集的tcpdump跟踪进行一些调查后,我发现Linux大约需要10毫秒来回答每个TCPAC
根据我的研究,每次收到新确认时,拥塞避免阶段都会设置CWND=CWND+MSS*(MSS/CWND)。这是假设我们没有遇到重复的ACKS或timeouts。但是如果有延迟的确认会发生什么?这是我对延迟确认研究的看法(不知道这是否正确):基本上,延迟ACK是目标将ACK段保留一段时间,以期发生以下两种情况之一。由于接收方接收到新数据包,在计时器结束之前将需要发送更多ACKS。或者接收方需要将一些数据发送回发送方,在这种情况下,它可以在该数据包上搭载消息。这如何影响拥塞避免阶段?这对于TCP的拥塞避免阶段是不利的,它依赖于新的Acks来增加CWND。这会导致CWND窗口大小更改延迟,从而导